﻿package fr.babos.core.mvc 
{
	/**
	 * Imports
	 */
	import fr.babos.core.bootstrap.IBootstrap;
	import fr.babos.core.masters.MasterMovieClip;
	import fr.babos.graphic.components.base.ResizableComponent;
	import org.osflash.signals.DeluxeSignal;
	import org.osflash.signals.events.GenericEvent;
	import org.osflash.signals.IDispatcher;
	import org.osflash.signals.ISignal;
	
	
	/**
	 * La classe de base pour les vues
	 * @author ZoulouX
	 */
	public class View extends ResizableComponent implements IView
	{
		/**
		 * Si l'objet est démarré
		 */
		protected var _started					:Boolean						= false;
		
		/**
		 * Lorsque l'objet est en train d'être démarré
		 */
		protected var _onTurningOn				:DeluxeSignal					= new DeluxeSignal(this);
		
		/**
		 * Lorsque l'objet est démarré
		 */
		protected var _onTurnedOn				:DeluxeSignal					= new DeluxeSignal(this);
		
		/**
		 * Lorsque l'objet est en train d'être arrêté
		 */
		protected var _onTurningOff				:DeluxeSignal					= new DeluxeSignal(this);
		
		/**
		 * Lorsque l'objet est arrêté
		 */
		protected var _onTurnedOff				:DeluxeSignal					= new DeluxeSignal(this);
		
		/**
		 * Le controlleur associé
		 */
		protected var _controller				:IController;
		
		/**
		 * Le bootstrap associé
		 */
		protected var _bootstrap				:IBootstrap;
		
		
		/**
		 * Si l'objet est démarré
		 */
		public function get started ():Boolean { return _started; };
		
		/**
		 * Lorsque l'objet est en train d'être démarré
		 */
		public function get onTurningOn ():ISignal { return _onTurningOn; };
		
		/**
		 * Lorsque l'objet est démarré
		 */
		public function get onTurnedOn ():ISignal { return _onTurnedOn; };
		
		/**
		 * Lorsque l'objet est en train d'être arrêté
		 */
		public function get onTurningOff ():ISignal { return _onTurningOff; };
		
		/**
		 * Lorsque l'objet est arrêté
		 */
		public function get onTurnedOff ():ISignal { return _onTurnedOff; };
		
		
		/**
		 * Le controlleur associé
		 */
		public function get controller ():IController { return _controller; }
		public function set controller (value:IController):void 
		{
			_controller = value;
		}
		
		/**
		 * Une référence vers le bootstrap qui a instancié ce controlleur
		 */
		public function get bootstrap ():IBootstrap { return _bootstrap; }
		public function set bootstrap (value:IBootstrap):void
		{
			_bootstrap = value;
		}
		
		
		/**
		 * Le constructeur
		 */
		public function View ()
		{
			
		}
		
		
		/**
		 * Dispatcher une notification engine
		 */
		protected function dispatchEngineSignal (pSignal:ISignal):void
		{
			// Dispatcher avec un event
			if (pSignal != null)
				(pSignal as IDispatcher).dispatch(new GenericEvent());
		}
		
		/**
		 * Démarrer l'objet
		 */
		public function turnOn ():void
		{
			// Démarré
			_started = true;
			
			// Dispatcher directement (ne pas faire de super pour comportement différent)
			dispatchEngineSignal(_onTurningOn);
			dispatchEngineSignal(_onTurnedOn);
		}
		
		/**
		 * Arrêter l'objet
		 */
		public function turnOff ():void
		{
			// Arrêté
			_started = false;
			
			// Dispatcher directement (ne pas faire de super pour comportement différent)
			dispatchEngineSignal(_onTurningOff);
			dispatchEngineSignal(_onTurnedOff);
		}
		
		/**
		 * Une valeur est injectée par un manager de dépendances
		 * @param	pPropertyName : Le nom de la propriété injectée
		 * @param	pInjectedValue : La valeur injectée
		 */
		public function injected (pPropertyName:String, pInjectedValue:*):void
		{
			
		}
		
		/**
		 * Détruire ce controlleur
		 */
		override public function dispose ():void
		{
			// Désactiver les signaux
			_onTurningOn.removeAll();
			_onTurnedOn.removeAll();
			_onTurningOff.removeAll();
			_onTurnedOff.removeAll();
			
			// Virer les signaux
			_onTurningOn = null;
			_onTurnedOn = null;
			_onTurningOff = null;
			_onTurnedOff = null;
			
			// Relayer
			super.dispose();
		}
	}
}